package com.bw.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.bw.entity.User;
import com.bw.mapper.UserMapper;
import org.spring.kun.common.GiteeUtils;
import org.spring.kun.common.TokenUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

@Controller
public class GiteeLoginController {


    @Autowired
    UserMapper userMapper;

    /**
     *   gitee会调用这个地址 而且会传来一个参数  ：临时授权码
     * @return
     */
    @RequestMapping("/callbackCode.do")
    public String callback(String code, HttpServletResponse response){

        System.out.println("接收到的临时授权码 " + code);
        // 根据授权码获取 token
        String tokenByCode = GiteeUtils.getAccessTokenByCode(code);
        System.out.println("获取到的token " + tokenByCode);

        //根据token 获取用户信息（gitee的用户信息）
        JSONObject userInfoByToken = GiteeUtils.getGiteeUserInfoByToken(tokenByCode);
        System.out.println("获取到的用户信息 " + JSON.toJSONString(userInfoByToken));

        // 解析出 gitee用户的四个字段   （个人空间地址， 昵称，头像， 主键）
        String name = userInfoByToken.getString("login"); //login是 个人空间地址
        String nickName = userInfoByToken.getString("name"); //name是 昵称
        String avatarUrl = userInfoByToken.getString("avatar_url"); //avatar_url是 头像
        Integer giteeId = userInfoByToken.getInteger("id");

        // 开始执行注册
        // 注册之前需要判断之前是否已经注册过了
        User userDB = userMapper.selectByName(name);

        if (userDB == null){ // 如果之前没有注册过 ，执行注册
            userDB = new User();
            userDB.setName(name);
            userDB.setGiteeId(giteeId);
            userDB.setAvatarUrl(avatarUrl);
            userDB.setNickName(nickName);
            userMapper.addUser(userDB);
        }else { // 如果之前已经注册过   则更新这个人 的昵称和头像

            userDB.setNickName(nickName);
            userDB.setAvatarUrl(avatarUrl);

            userMapper.updateUserById(userDB);
        }
        // 制作令牌 返回给浏览器 放入cookie  这里使用封装的工具类代替
//        String token = JwtUtils.createToken(userDB);
//        Cookie cookie = new Cookie("token", token);
//        response.addCookie(cookie);

        // 加密用户信息 得到token， 把token放入cookie， 用response返回给浏览器  并且设置30分钟有效期
        TokenUtils.responseTokenByCookie(userDB,response,30);

        return "redirect:list.do";
    }
}
